// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraTaggedWidget.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraTaggedWidget)

//@TODO: 此文件中的其他TODO都与基于标签的控件显示/隐藏相关，参见 UE-142237

/**
 * 构造函数
 * @param ObjectInitializer 对象初始化器
 */
ULyraTaggedWidget::ULyraTaggedWidget(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer) // 调用父类构造函数
{
}

/**
 * 原生构造
 * 监听隐藏标签的变化并设置初始可见性
 */
void ULyraTaggedWidget::NativeConstruct()
{
	Super::NativeConstruct(); // 调用父类方法

	if (!IsDesignTime()) // 如果不是设计时
	{
		// 监听我们隐藏标签的标签变化
		//@TODO: 我之前说的事情

		// 设置我们的初始可见性值（检查标签等...）
		SetVisibility(GetVisibility()); // 设置可见性
	}
}

/**
 * 原生析构
 * 停止监听标签变化
 */
void ULyraTaggedWidget::NativeDestruct()
{
	if (!IsDesignTime()) // 如果不是设计时
	{
		//@TODO: 停止监听标签变化
	}

	Super::NativeDestruct(); // 调用父类方法
}

/**
 * 设置可见性
 * 根据调用者请求和标签状态设置可见性
 * @param InVisibility 可见性
 */
void ULyraTaggedWidget::SetVisibility(ESlateVisibility InVisibility)
{
#if WITH_EDITORONLY_DATA // 仅在编辑器数据环境下编译
	if (IsDesignTime()) // 如果是设计时
	{
		Super::SetVisibility(InVisibility); // 调用父类设置可见性
		return;
	}
#endif

	// 记住调用者请求的内容；即使我们当前被标签抑制，我们也应该在完成后尊重这个调用
	bWantsToBeVisible = ConvertSerializedVisibilityToRuntime(InVisibility).IsVisible(); // 设置想要可见的标志
	if (bWantsToBeVisible) // 如果想要可见
	{
		ShownVisibility = InVisibility; // 设置显示时的可见性
	}
	else // 如果不想要可见
	{
		HiddenVisibility = InVisibility; // 设置隐藏时的可见性
	}

	const bool bHasHiddenTags = false;//@TODO: Foo->HasAnyTags(HiddenByTags); // 检查是否有隐藏标签

	// 实际应用可见性
	const ESlateVisibility DesiredVisibility = (bWantsToBeVisible && !bHasHiddenTags) ? ShownVisibility : HiddenVisibility; // 计算期望的可见性
	if (GetVisibility() != DesiredVisibility) // 如果当前可见性不等于期望可见性
	{
		Super::SetVisibility(DesiredVisibility); // 调用父类设置可见性
	}
}

/**
 * 当观察的标签改变时调用
 * 根据标签状态更新可见性
 */
void ULyraTaggedWidget::OnWatchedTagsChanged()
{
	const bool bHasHiddenTags = false;//@TODO: Foo->HasAnyTags(HiddenByTags); // 检查是否有隐藏标签

	// 实际应用可见性
	const ESlateVisibility DesiredVisibility = (bWantsToBeVisible && !bHasHiddenTags) ? ShownVisibility : HiddenVisibility; // 计算期望的可见性
	if (GetVisibility() != DesiredVisibility) // 如果当前可见性不等于期望可见性
	{
		Super::SetVisibility(DesiredVisibility); // 调用父类设置可见性
	}
}